ποΈGitΠ―ΡΠ°ποΈ
Node / meshtastic / Meshtastic-Android / files / feature / firmware / src / commonMain / kotlin / org / meshtastic / feature / firmware / FirmwareFileHandler.kt
Displaying Raw β’ Download
feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareFileHandler.kt 0a44b948ec0573dc62ec68c19e46e62d40fcd1a3 (0a44b948) Text, 5.71 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.firmware
Tff7b72import T7ee787org.meshtastic.core.common.util.CommonUri
Tff7b72import T7ee787org.meshtastic.core.model.DeviceHardware
T8b949e/**
* Abstraction over platform file and network I/O required by the firmware update pipeline. Implementations live in
* `androidMain` and `jvmMain`.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72interface T56d364FirmwareFileHandler Tb4b4b4{
T8b949e// ββ Lifecycle / cleanup ββββββββββββββββββββββββββββββββββββββββββββββ
T8b949e/** Remove all temporary firmware files created during previous update sessions. */
Tff7b72fun Td2a8ffcleanupAllTemporaryFilesTb4b4b4(Tb4b4b4)
T8b949e/** Delete a single firmware [file] from local storage. */
Tff7b72suspend Tff7b72fun Td2a8ffdeleteFileTb4b4b4(Te6edf3fileTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4)
T8b949e// ββ Network ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
T8b949e/** Return `true` if [url] is reachable (HTTP HEAD check). */
Tff7b72suspend Tff7b72fun Td2a8ffcheckUrlExistsTb4b4b4(Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean
T8b949e/** Fetch the UTF-8 text body of [url], returning `null` on any HTTP or network error. */
Tff7b72suspend Tff7b72fun Td2a8fffetchTextTb4b4b4(Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String?
T8b949e/**
* Download a file from [url], saving it as [fileName] in a temporary directory.
*
* @param onProgress Progress callback (0.0 to 1.0).
* @return The downloaded [FirmwareArtifact], or `null` on failure.
*/
Tff7b72suspend Tff7b72fun Td2a8ffdownloadFileTb4b4b4(Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3onProgressTb4b4b4: Tb4b4b4(Tffa657FloatTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tb4b4b4: Te6edf3FirmwareArtifact?
T8b949e// ββ File I/O βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
T8b949e/** Return the size in bytes of the given firmware [file]. */
Tff7b72suspend Tff7b72fun Td2a8ffgetFileSizeTb4b4b4(Te6edf3fileTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4)Tb4b4b4: Tffa657Long
T8b949e/** Read the raw bytes of a [FirmwareArtifact]. */
Tff7b72suspend Tff7b72fun Td2a8ffreadBytesTb4b4b4(Te6edf3artifactTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4)Tb4b4b4: Te6edf3ByteArray
T8b949e/**
* Copy a platform URI into a temporary [FirmwareArtifact] so it can be read with [readBytes]. Returns `null` when
* the URI cannot be resolved.
*/
Tff7b72suspend Tff7b72fun Td2a8ffimportFromUriTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4)Tb4b4b4: Te6edf3FirmwareArtifact?
T8b949e/** Copy [source] to the platform URI [destinationUri], returning the number of bytes written. */
Tff7b72suspend Tff7b72fun Td2a8ffcopyToUriTb4b4b4(Te6edf3sourceTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4, Te6edf3destinationUriTb4b4b4: Te6edf3CommonUriTb4b4b4)Tb4b4b4: Tffa657Long
T8b949e// ββ Zip / extraction βββββββββββββββββββββββββββββββββββββββββββββββββ
T8b949e/**
* Extract a matching firmware binary from a platform URI (e.g. content:// or file://) zip archive.
*
* @param hardware Used to match the correct binary inside the zip.
* @param fileExtension The extension to filter for (e.g. ".bin", ".uf2").
* @param preferredFilename Optional exact filename to prefer within the zip.
* @return The extracted [FirmwareArtifact], or `null` if no matching file was found.
*/
Tff7b72suspend Tff7b72fun Td2a8ffextractFirmwareTb4b4b4(
Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4,
Te6edf3hardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4,
Te6edf3fileExtensionTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3preferredFilenameTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3FirmwareArtifact?
T8b949e/**
* Extract a matching firmware binary from a previously-downloaded zip [FirmwareArtifact].
*
* @param zipFile The zip archive to extract from.
* @param hardware Used to match the correct binary inside the zip.
* @param fileExtension The extension to filter for (e.g. ".bin", ".uf2").
* @param preferredFilename Optional exact filename to prefer within the zip.
* @return The extracted [FirmwareArtifact], or `null` if no matching file was found.
*/
Tff7b72suspend Tff7b72fun Td2a8ffextractFirmwareFromZipTb4b4b4(
Te6edf3zipFileTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4,
Te6edf3hardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4,
Te6edf3fileExtensionTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3preferredFilenameTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3FirmwareArtifact?
T8b949e/**
* Extract all entries from a zip [artifact] into a `Map<entryName, bytes>`. Used by the DFU handler to parse Nordic
* DFU packages.
*/
Tff7b72suspend Tff7b72fun Td2a8ffextractZipEntriesTb4b4b4(Te6edf3artifactTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4)Tb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3ByteArrayTff7b72>
Tb4b4b4}
T8b949e/**
* Check whether [filename] is a valid firmware binary for [target] with the expected [fileExtension]. Excludes
* non-firmware binaries that share the same extension (e.g. `littlefs-*`, `bleota*`).
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffComplexConditionTa5d6ff"Tb4b4b4)
Tff7b72internal Tff7b72fun Td2a8ffisValidFirmwareFileTb4b4b4(Te6edf3filenameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3targetTb4b4b4: Tffa657StringTb4b4b4, Te6edf3fileExtensionTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6fflittlefs-Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffbleotaTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffmt-Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3filenameTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff.factory.Ta5d6ff"Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72false
Tb4b4b4}
Tff7b72val Te6edf3regex Tff7b72= Te6edf3RegexTb4b4b4(Ta5d6ff"Ta5d6ff.*[Ta5d6ff\\Ta5d6ff-_]Tffd700${Te6edf3RegexTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3targetTb4b4b4)Tffd700}Ta5d6ff[Ta5d6ff\\Ta5d6ff-_.].*Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3filenameTb4b4b4.Te6edf3endsWithTb4b4b4(Te6edf3fileExtensionTb4b4b4) Tff7b72&Tff7b72&
Te6edf3filenameTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3targetTb4b4b4) Tff7b72&Tff7b72&
Tb4b4b4(Te6edf3regexTb4b4b4.Te6edf3matchesTb4b4b4(Te6edf3filenameTb4b4b4) Tff7b72|Tff7b72| Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Tffd700$Te6edf3targetTa5d6ff-Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72| Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Tffd700$Te6edf3targetTa5d6ff.Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.13s